João Távora [Sat, 19 May 2018 08:29:52 +0000 (09:29 +0100)]
Simplify some infrastructure fucntions
* eglot.el (eglot--contact): Simplify docstring.
(eglot--make-process): Simplify.
(eglot--connect): Simplify.
(eglot--interactive): Simplify and correct odd bug.
(eglot--process-sentinel): Correct messages. Delete before
attempting reconnection.
(eglot-shutdown): Simplify.
João Távora [Thu, 17 May 2018 13:09:50 +0000 (14:09 +0100)]
* eglot.el (version): bump to 0.3
João Távora [Thu, 17 May 2018 13:03:20 +0000 (14:03 +0100)]
Make it work on windows
Apparently passing :coding 'no-conversion to make-process on windows
is essential to receive any text at all in the process filter.
Also needed to tweak uri-to-path and path-to-uri.
Thanks to lsp-mode.el for these hints
* eglot.el (eglot--make-process): Pass :coding 'no-conversion to
make-process.
(eglot--path-to-uri): Add a forward slash if windows-nt.
(eglot--uri-to-path): Remove a forward slash if windows-nt.
(eglot--server-textDocument/publishDiagnostics): Simplify and use
eglot--uri-to-path.
João Távora [Thu, 17 May 2018 13:04:15 +0000 (14:04 +0100)]
Fix eglot--error and eglot--message helpers
* eglot.el (eglot--error, eglot--message):
Safely interpret %s.
João Távora [Thu, 17 May 2018 13:04:33 +0000 (14:04 +0100)]
* eglot.el (eglot--lambda): add missing indent spec.
João Távora [Wed, 16 May 2018 23:30:53 +0000 (00:30 +0100)]
Simplify some function calling infrastructure
eglot--mapply is a confusing abstraction. Hide some of that confusion
behind eglot--lambda. More stably dispatch server notifications and
requests without introspecting their contents.
* eglot.el (eglot--process-receive): Simplify.
(eglot--async-request): Improve doc.
(eglot--request): Simplify.
(eglot--mapply): Remove.
(xref-backend-identifier-completion-table)
(xref-backend-definitions, xref-backend-references)
(xref-backend-apropos, eglot-completion-at-point)
(eglot-eldoc-function, eglot-imenu, eglot--apply-text-edits):
Don't use eglot--mapply, use normal mapcar/mapc.
João Távora [Wed, 16 May 2018 22:45:35 +0000 (23:45 +0100)]
Replace eglot--with-lsp-range with a function and pcase-let
* eglot.el (eglot--with-lsp-range): Remove.
(eglot--range-region): New function.
(eglot--server-textDocument/publishDiagnostics)
(eglot--hover-info, eglot-eldoc-function)
(eglot--apply-text-edits): Use it.
João Távora [Tue, 15 May 2018 12:24:08 +0000 (13:24 +0100)]
Add php's php-language-server to built-in guessed servers
Closes https://github.com/joaotavora/eglot/issues/1. The problem in that issue is that php-language-server has a
bug when it's not passed it the deprecated ":rootPath" field. The bug
doesn't happen if the ":processId" field is also absent. Eglot was
triggering the bug, because it didn't pass ":rootPath", but there's
nothing wrong in doing so.
* README.md: Add php-language-server to the built-in list.
* eglot.el (eglot-server-programs): Add php-language-server.
(eglot--connect): Also pass (deprecated) rootPath.
João Távora [Tue, 15 May 2018 09:59:46 +0000 (10:59 +0100)]
Bump version and slightly improve doc
* eglot.el: Bump version. Add nicer Commentary header.
(eglot): Improve docstring.
* README.md: Update
João Távora [Mon, 14 May 2018 22:58:29 +0000 (23:58 +0100)]
More quietly report request timeouts as events
* eglot.el (eglot--sync-request): Use eglot--log-event
João Távora [Mon, 14 May 2018 22:09:27 +0000 (23:09 +0100)]
Shutdown server if connection initialization fails
Also tweak autoreconnection logic
* eglot.el (eglot--connect): Immediately `eglot-shutdown` if
connection initialization failed. Don't treat interactive calls
specially.
(eglot--process-sentinel): Tweak messages.
João Távora [Mon, 14 May 2018 21:19:23 +0000 (22:19 +0100)]
Fix a ridiculous bug when generating transient projects
* eglot.el (eglot--find-current-process, eglot--interactive): Fix
horrible bug.
João Távora [Mon, 14 May 2018 13:18:18 +0000 (14:18 +0100)]
Support didchangewatchedfiles with dynamic registration
RLS uses this, presumaly for knowing about Cargo.toml changes and stuff.
* README.md: Update protocol compliance.
* eglot.el (filenotify): Require it.
(eglot--file-watches): New process-local var.
(eglot--process-sentinel): Kill all watches
(eglot--register-unregister): New helper.
(eglot--server-client/registerCapability): Simplify.
(eglot--server-client/unregisterCapability): New method.
(eglot--register-workspace/didChangeWatchedFiles)
(eglot--unregister-workspace/didChangeWatchedFiles): New
capability.
(eglot--client-capabilities): Update.
João Távora [Mon, 14 May 2018 10:41:46 +0000 (11:41 +0100)]
Remove an unused variable
* eglot.el (eglot--expect-carriage-return): Get rid of this.
João Távora [Mon, 14 May 2018 10:20:37 +0000 (11:20 +0100)]
Now send willsavewaituntil
* eglot.el (eglot--client-capabilities): Report willSaveWaitUntil.
(eglot--server-workspace/applyEdit): Fix docstring.
(eglot--signal-textDocument/willSave): Send willSaveWaitUntil
(eglot--signal-textDocument/didOpen)
(eglot--signal-textDocument/didClose): Don't eglot--obj.
(eglot--apply-text-edits): Simplify. Use current buffer.
(eglot--apply-workspace-edit): Use new eglot--apply-text-edits.
João Távora [Mon, 14 May 2018 09:50:49 +0000 (10:50 +0100)]
Don't define a menu if nothing to show there for now
* eglot.el (eglot-menu): Remove it.
(eglot--mode-line-format): Don't define a menu.
João Távora [Sun, 13 May 2018 22:25:15 +0000 (23:25 +0100)]
Use rls in travis ci and add actual tests
Also run a hook when connected
* eglot-tests.el (eglot--with-dirs-and-files)
(eglot--make-file-or-dirs, eglot--call-with-dirs-and-files)
(eglot--find-file-noselect): New helpers.
(auto-detect-running-server, auto-reconnect): New actual tests.
* eglot.el (eglot-connect): Run hook when connected
(eglot-connect-hook): New variable
* .travis.yml: Use rust stable and install rls
* README.md: Update mention of automated tests
João Távora [Sun, 13 May 2018 22:22:31 +0000 (23:22 +0100)]
Fix automatic project creation
* eglot.el (eglot): Take PROJECT arg. Return process.
(eglot--interactive): Returns a project.
João Távora [Sun, 13 May 2018 21:03:32 +0000 (22:03 +0100)]
Work with any old directory, no formal project needed
Actually, uses a "transient project" which project-current returns if
desperate.
* README.md: Update
* eglot.el (eglot--current-process)
(eglot--current-process-or-lose): Simplify.
(eglot): Maybe prompt user for project.
João Távora [Sun, 13 May 2018 19:35:45 +0000 (20:35 +0100)]
Ask server for textdocument/signaturehelp if it supports it
* eglot.el (eglot--client-capabilities): Capable of signature Help.
(eglot--sig-info): Helper for eglot-eldoc-function.
(eglot-eldoc-function): Send textDocument/signatureHelp
* README.md: Update to mention textDocument/signatureHelp
João Távora [Sat, 12 May 2018 21:05:20 +0000 (22:05 +0100)]
Fix copyright header. obviously not since 2003
João Távora [Sun, 13 May 2018 01:39:32 +0000 (02:39 +0100)]
Reinstate the catch/loop/throw idiom in eglot-request
This reverts parts of commit
fabee14ed5b32c30c6ac5cb1ce88f387522a6a1e.
Unfortunately, this may cause problems when calling the error
callbacks directly as in the process sentinel. In that particular
scenario the accept-process-output won't have return, because no
output has is being handled. Consequently, if we're unlucky, we have
another 30 seconds to way before the flag is tested and the loop
exits.
* eglot.el (eglot-request): Use catch/loop/throw again
João Távora [Sat, 12 May 2018 14:59:53 +0000 (15:59 +0100)]
New command eglot-help-at-point and a readme update
* README.md (Commands and keybindings): New section.
* eglot.el (eglot-eldoc-function): Use eglot--hover-info.
Don't care about kind in highlightSymbol
(eglot--hover-info): New helper.
(eglot-help-at-point): New command.
João Távora [Fri, 11 May 2018 10:46:53 +0000 (11:46 +0100)]
Get rid of catch/loop/throw idiom (suggested by thien-thi nguyen)
* eglot.el (eglot--process-filter)
(eglot--request): Replace catch/loop/throw idiom with let/test/loop/set
João Távora [Fri, 11 May 2018 09:59:59 +0000 (10:59 +0100)]
Rework autoreconnection logic
Can't be a global var, has to be a per process thing.
* eglot.el (eglot-autoreconnect): New defcustom
(eglot--inhibit-autoreconnect): Renamed from eglot--inhibit-autoreconnect
(eglot--connect): Run autoreconnect timer here.
(eglot--inhibit-auto-reconnect): Removed.
(eglot--process-sentinel): Don't run timer here. Rework.
(eglot, eglot-reconnect): Pass INTERACTIVE to eglot--connect.
João Távora [Fri, 11 May 2018 01:03:10 +0000 (02:03 +0100)]
Duh, json.el is in emacs, and json-mode.el is useless here
* eglot.el (Package-Requires): Don't require json-mode
João Távora [Thu, 10 May 2018 21:40:32 +0000 (22:40 +0100)]
Prepare to sumbit to gnu elpa
* eglot.el: Update headers.
João Távora [Thu, 10 May 2018 21:56:11 +0000 (22:56 +0100)]
(eglot--xref-make): fix use of cl-destructuring-bind.
João Távora [Thu, 10 May 2018 21:04:59 +0000 (22:04 +0100)]
Misc little adjustments for readability
* eglot.el (eglot--log-event, eglot--process-receive)
(eglot--xref-make, xref-backend-apropos): Use cl-destructuring-bind.
(eglot--server-window/showMessageRequest): Compact.
João Távora [Thu, 10 May 2018 20:56:54 +0000 (21:56 +0100)]
Support :completionitem/resolve
This is quite handy with company and company-quickhelp
* eglot.el (eglot-completion-at-point): Send
:completionItem/resolve
* README.md: Mention completionItem/resolve
João Távora [Thu, 10 May 2018 20:31:37 +0000 (21:31 +0100)]
Rename functions. eglot--request is now the synchronous one
* eglot.el (eglot--connect, eglot-shutdown)
(xref-backend-identifier-completion-table)
(xref-backend-definitions, xref-backend-references)
(xref-backend-apropos, eglot-completion-at-point, eglot-rename):
Call eglot--request.
(eglot--async-request): Renamed from eglot--request.
(eglot--request): Renamed from eglot--sync-request.
(eglot--TextDocumentIdentifier)
(eglot--VersionedTextDocumentIdentifier)
(eglot--TextDocumentPositionParams, eglot--TextDocumentItem):
Renamed from the more verbose eglot--current-buffer-* variante.
(eglot-rename, eglot-imenu, eglot-eldoc-function)
(eglot-completion-at-point, xref-backend-definitions)
(xref-backend-identifier-at-point)
(eglot--signal-textDocument/didSave)
(xref-backend-identifier-completion-table)
(eglot--signal-textDocument/didClose)
(eglot--signal-textDocument/didOpen)
(eglot--signal-textDocument/didChange): Use new function names.
João Távora [Thu, 10 May 2018 19:00:15 +0000 (20:00 +0100)]
Friendlier m-x eglot
* eglot.el (eglot-server-programs): Renamed from eglot-executables
(eglot--interactive): Redesign
(eglot): Docstring.
(eglot--connect): Now a synchronous gig.
(eglot--interactive): Friendlier.
(eglot): Improve docstring, rework a bit.
(eglot-reconnect): Rework a bit.
(eglot--process-sentinel): Insert "byebye" ruler here.
* README.md: Update
João Távora [Thu, 10 May 2018 18:23:56 +0000 (19:23 +0100)]
Improve eglot-eldoc-function
Use the :range key if the server provided it. Also simplify code with
a new eglot--with-lsp-range macro.
* eglot.el (eglot--format-markup): Tweak comment.
(eglot--with-lsp-range): New helper macro.
(eglot--server-textDocument/publishDiagnostics)
(eglot--apply-text-edits): Use it.
(eglot-eldoc-function): Use range if server provides it.
João Távora [Thu, 10 May 2018 17:44:47 +0000 (18:44 +0100)]
Reduce log chatter
* eglot.el (eglot--process-sentinel, eglot--request): Use
eglot--log-event.
(eglot--log-event): Print "message" if type unknown.
(eglot--debug, eglot--log): Remove.
(eglot--server-window/logMessage, eglot--server-telemetry/event):
Make noops.
(eglot--call-deferred): Also reduce chatter here.
João Távora [Thu, 10 May 2018 12:52:21 +0000 (13:52 +0100)]
Only call deferred actions after a full message has been received
Otherwise it can be quite wasteful.
* eglot.el (eglot--process-filter): Don't eglot--call-deferred here.
(eglot--process-receive): Do it here.
João Távora [Thu, 10 May 2018 12:14:19 +0000 (13:14 +0100)]
Resist server failure during synchronous requests
Calling the error handler unprotected could lead to the rest of the
sentinel not running at all. This defeated the auto-reconnection in
Rust, for example.
* eglot.el (eglot--process-sentinel): Rework.
João Távora [Thu, 10 May 2018 11:54:35 +0000 (12:54 +0100)]
Simplify mode-line updating logic
* eglot.el (eglot--define-process-var): Simplify.
(eglot--short-name, eglot--spinner, eglot--status): Don't
auto-update mode-line.
(eglot--process-receive): Update it here.
João Távora [Thu, 10 May 2018 11:51:21 +0000 (12:51 +0100)]
More rls-specifics: update flymake diags when indexing done
RLS could/should report diagnostics for every opened file, even if
there aren't any problems. Because it doesn't, loop for every buffer
managed by the process and call eglot--current-flymake-report-fn
* eglot.el
(eglot--server-window/progress): Call eglot--current-flymake-report-fn
João Távora [Thu, 10 May 2018 11:21:29 +0000 (12:21 +0100)]
Adjust flymake integration
When opening a new file (signalling textDocument/didOpen) it makes
sense to call the flymake callback (if it exists) with no diagnostics,
just to get rid of that "Wait", since we don't know if later in this
callback cycle the server will ever report new diagnostics.
* eglot.el (eglot--managed-mode): Don't call flymake-mode or eldoc-mode
(eglot--managed-mode-hook): Add them here.
(eglot--maybe-activate-editing-mode): Call flymake callback.
(eglot--server-textDocument/publishDiagnostics): Set unreported
diagnostics to nil if invoking callback.
João Távora [Thu, 10 May 2018 11:07:31 +0000 (12:07 +0100)]
Shorten summary line to appease package-lint.el
João Távora [Thu, 10 May 2018 11:07:11 +0000 (12:07 +0100)]
More correctly setup rust-mode-related autoloads
By autoloading the add-hook form and the eglot--setup-rls-idiosyncrasies
definition, a user can start rust-mode without loading eglot.el along
with it.
* eglot.el (rust-mode-hook)
(eglot--setup-rls-idiosyncrasies): Wrap in autoloaded progn.
João Távora [Wed, 9 May 2018 22:24:15 +0000 (23:24 +0100)]
Add minimal headers, commentary and autoloads
João Távora [Wed, 9 May 2018 22:12:19 +0000 (23:12 +0100)]
Fancier rls spinner
* eglot.el (eglot--mode-line-format): Use (nth 3) of
eglot--spinner.
(eglot--server-window/progress): Save detail message in spinner.
João Távora [Wed, 9 May 2018 21:41:37 +0000 (22:41 +0100)]
New "deferred requests" that wait until server is ready
Calling textDocument/hover or textDocument/documentHighlight before
the server has had a chance to process a textDocument/didChange is
normally useless. The matter is worse for servers like RLS which only
become ready much later and send a special notif for it (see
https://github.com/rust-lang-nursery/rls/issues/725).
So, keeping the same coding style add a DEFERRED arg to eglot--request
that makes it maybe not run the function immediately. Add a bunch of
logic for probing readiness of servers.
* README.md: Update
* eglot.el (eglot--deferred-actions): New process-local var.
(eglot--process-filter): Call deferred actions.
(eglot--request): Rewrite.
(eglot--sync-request): Rewrite.
(eglot--call-deferred, eglot--ready-predicates)
(eglot--server-ready-p): New helpers.
(eglot--signal-textDocument/didChange): Set spinner and call
deferred actions.
(eglot-completion-at-point): Pass DEFERRED to eglot-sync-request.
(eglot-eldoc-function): Pass DEFERRED to eglot-request
(eglot--rls-probably-ready-for-p): New helper.
(rust-mode-hook): Add eglot--setup-rls-idiosyncrasies
(eglot--setup-rls-idiosyncrasies): New helper.
João Távora [Wed, 9 May 2018 21:28:29 +0000 (22:28 +0100)]
Call eglot-eldoc-function after completion finishes
* eglot.el (eglot-completion-at-point): Call
eglot-eldoc-function after completion finishes.
João Távora [Wed, 9 May 2018 21:26:02 +0000 (22:26 +0100)]
Simplify `eglot-shutdown`
* eglot.el (eglot, eglot-reconnect)
(eglot--managed-mode): Call new eglot-shutdown.
(eglot-shutdown): Simplify.
(eglot--process-sentinel): Also call error functions.
(eglot--process-filter): Reindent.
João Távora [Wed, 9 May 2018 11:24:10 +0000 (12:24 +0100)]
Get rid of eglot-mode
* eglot.el (eglot--managed-mode): Don't call eglot-mode. When
shutting down, offer to kill server.
(mode-line-misc-info): Update to use eglot--managed-mode
João Távora [Wed, 9 May 2018 09:58:28 +0000 (10:58 +0100)]
Simplify eglot--signal-textdocument/didchange
* eglot.el (eglot--recent-before-changes)
(eglot--recent-after-changes): Delete.
(eglot--recent-changes): New var.
(eglot--outstanding-edits-p, eglot--before-change)
(eglot--after-change): Rewrite.
(eglot--signal-textDocument/didChange): Rewrite.
(eglot--signal-textDocument/didOpen): Initialize
buffer-local eglot--recent-changes here.
João Távora [Wed, 9 May 2018 01:43:47 +0000 (02:43 +0100)]
Fix odd bugs and tweak stuff
* eglot.el (eglot--log-event): Insert before markers.
(eglot--process-receive): Shave lines.
(xref-backend-references): Use cl-return-from.
(eglot--log-event): Simplify
(eglot-completion-at-point): Saner annotation
João Távora [Tue, 8 May 2018 15:07:07 +0000 (16:07 +0100)]
Support workspace/applyedit
* eglot.el (eglot--reply): Don't send result or error if not
provided.
(eglot--server-workspace/applyEdit): New server method.
(eglot--apply-text-edits): Rework.
(eglot--apply-workspace-edit): New helper.
(eglot-rename): Simplify.
João Távora [Tue, 8 May 2018 12:37:35 +0000 (13:37 +0100)]
Support textdocument/rename
* README.md: Mention rename support.
* eglot.el (eglot--uri-to-path): Handle uri hidden in keywords.
(eglot--apply-text-edits): New helper.
(eglot-rename): New interactive command.
(eglot--client-capabilities): Add rename capability.
João Távora [Tue, 8 May 2018 10:38:02 +0000 (11:38 +0100)]
Reasonable textdocument/documenthighlight support
* README.md: Update.
* eglot.el (eglot--current-buffer-TextDocumentPositionParams): New
helper.
(xref-backend-identifier-completion-table): Refactor a bit.
(xref-backend-identifier-at-point): Use when-let and
eglot--current-buffer-TextDocumentPositionParams
(xref-backend-definitions, xref-backend-references): Refactor a
bit.
(eglot-completion-at-point): Use
eglot--current-buffer-TextDocumentPositionParams
(eglot-eldoc-function): Rewrite to handle
textDocument/documentHighlight.
(eglot--highlights): New variable.
(eglot--client-capabilities): Update with support for documentHighlight.
João Távora [Tue, 8 May 2018 01:05:03 +0000 (02:05 +0100)]
Fix odd bugs
* eglot.el (eglot--process-receive, eglot--request): Set status to
actual error message.
(eglot--managed-mode): Manage imenu-create-index-function
correctly.
(eglot--mode-line-format): Print error status.
João Távora [Tue, 8 May 2018 00:52:27 +0000 (01:52 +0100)]
When killing server, always wait 3 seconds
* eglot.el (eglot--request): Accept TIMEOUT param.
João Távora [Tue, 8 May 2018 00:46:30 +0000 (01:46 +0100)]
Try to fix some textdocument/completion bugs
* eglot.el (eglot-completion-at-point): Rework slightly.
João Távora [Mon, 7 May 2018 22:43:03 +0000 (23:43 +0100)]
Half-decent imenu support via textdocument/documentsymbol
* README.md: Update capability
* eglot.el (eglot--lsp-position-to-point): New function.
(eglot--managed-mode): Handle imenu-create-index-function.
(eglot--server-textDocument/publishDiagnostics): Use
eglot--lsp-position-to-point.
(eglot-imenu): New function.
(eglot--client-capabilities): Capable of documentSymbol.
João Távora [Mon, 7 May 2018 21:56:20 +0000 (22:56 +0100)]
Only request stuff that server says it's capable of
* eglot.el (eglot--server-capable): New helper.
(eglot-xref-backend)
(xref-backend-identifier-completion-table)
(xref-backend-references, xref-backend-apropos)
(eglot-completion-at-point, eglot-eldoc-function): Use it.
João Távora [Mon, 7 May 2018 21:40:53 +0000 (22:40 +0100)]
Simplify mode-line code with a helper.
* eglot.el (eglot--mdoe-line-props): New helper.
(eglot--mode-line-format): Use it.
João Távora [Mon, 7 May 2018 21:16:28 +0000 (22:16 +0100)]
Get rid of eglot--buffer-open-count
Hasn't really proved useful yet.
* eglot.el (eglot--buffer-open-count): Remove.
(eglot--signal-textDocument/didOpen)
(eglot--signal-textDocument/didClose): Simplify.
João Távora [Mon, 7 May 2018 21:15:21 +0000 (22:15 +0100)]
Get rid of eglot--special-buffer-process
Hasn't really proved useful yet.
* eglot.el (eglot--special-buffer-process): Delete.
(eglot--current-process): Simplify.
(eglot--events-buffer): Simplify.
João Távora [Mon, 7 May 2018 21:14:06 +0000 (22:14 +0100)]
* eglot.el: reformat to shave off some lines.
João Távora [Mon, 7 May 2018 21:06:49 +0000 (22:06 +0100)]
Fix bug in hover support
* eldoc.el (eglot-eldoc-function): Use eglot--format-markup.
(subr-x): Require it.
(eglot--format-markup): Pacify byte-compiler.
João Távora [Mon, 7 May 2018 17:46:28 +0000 (18:46 +0100)]
Clean up client capabilities
* eglot.el (eglot--client-capabilities): Clean up client
capabilities.
João Távora [Mon, 7 May 2018 17:45:57 +0000 (18:45 +0100)]
Half-baked textdocument/hover support
* eglot.el (eglot--format-markup): New helper.
(eglot--managed-mode): Handle eldoc-documentation-function.
(eglot-eldoc-function): New function.
* README.md: update
João Távora [Mon, 7 May 2018 17:43:30 +0000 (18:43 +0100)]
Tweak the async request engine.
* eglot.el (eglot--request): Return the continuation id.
(eglot--lambda): Move up in the file.
(eglot--sync-request): Use a catch-tag.
João Távora [Mon, 7 May 2018 16:27:01 +0000 (17:27 +0100)]
Explain why didopen on after-revert-hook is a bad idea
The reason is that the global find-file-hook is called again, and that
already does the didOpen. Too many didOpen's would be bad.
* eglot.el (eglot--managed-mode): Remove commented lines.
João Távora [Mon, 7 May 2018 16:23:27 +0000 (17:23 +0100)]
Half-decent completion support
* README.md: Update.
* eglot.el (eglot--kind-names): New variable.
(eglot--managed-mode): Handle completion-at-point-functions.
(eglot-completion-at-point): New function.
João Távora [Mon, 7 May 2018 15:32:23 +0000 (16:32 +0100)]
Solve another textdocument/didchange bug
* eglot.el (eglot--signal-textDocument/didChange): Rework a bit.
(eglot--after-change): Store the actual after-text in the
eglot--recent-after-changes.
João Távora [Mon, 7 May 2018 14:04:02 +0000 (15:04 +0100)]
Support javascript's javascript-typescript-langserver
* README.md: Improve a bit
* eglot.el (eglot--make-process): Take MANAGED-MAJOR-MODE arg
(eglot-executables): Add basic javascript support.
(eglot--connect): Pass mode to eglot--make-process
(eglot--interactive): Check that guessed command is a listp.
(eglot): Minor improvement to message.
(eglot--current-buffer-TextDocumentItem): Guess language from mode
symbol.
João Távora [Mon, 7 May 2018 12:45:10 +0000 (13:45 +0100)]
Increase request timeout length to 10 seconds
* eglot.el (eglot-request-timeout): New var.
(eglot--request): Use it.
João Távora [Mon, 7 May 2018 12:42:56 +0000 (13:42 +0100)]
Workaround two suspected emacs bugs
* eglot.el (eglot--process-filter): Use a proper unique tag. Use
unwind-protect.
(eglot--sync-request): Rework.
(eglot--server-client/registerCapability): Use a proper done tag.
João Távora [Mon, 7 May 2018 11:18:08 +0000 (12:18 +0100)]
Etoomanylambdas
* eglot.el (eglot--sync-request): Remove a lambda.
João Távora [Mon, 7 May 2018 10:53:44 +0000 (11:53 +0100)]
Fix the odd bug here and there
* eglot.el (eglot--connect): Activate editing mode where
applicable here.
(eglot, eglot-reconnect): Not here or here.
(eglot--process-sentinel): Catch auto-reconnect errors.
(eglot--notify): Dont send 'id=null', it messes up js's lsp
(eglot--reply): Do send id here.
(eglot--log-event): Simplify protocol. Complexify implementation.
(eglot--process-receive, eglot--process-send): Simplify
eglot--log-event call.
(eglot--request, eglot--notify, eglot--reply): Simplify
eglot--process-send call
(eglot--server-client/registerCapability): Fix bug when replying
with wrong id.
(eglot--xref-reset-known-symbols): Take DUMMY arg.
João Távora [Sat, 5 May 2018 10:26:12 +0000 (11:26 +0100)]
Half-decent xref support
* eglot.el
(eglot--xref-known-symbols): New hacky var.
(eglot--xref-reset-known-symbols): New helper.
(xref-find-definitions, xref-find-references): Advise after to
call the new helper.
(xref-backend-identifier-completion-table): Rework.
(eglot--xref-make): New helper.
(xref-backend-definitions): Use it.
(xref-backend-references, xref-backend-apropos): Implement.
(eglot--obj): Add a debug spec.
(eglot--lambda): Add debug spec.
João Távora [Sat, 5 May 2018 01:29:06 +0000 (02:29 +0100)]
Very basic xref support
* eglot.el (eglot--pos-to-lisp-position): Move up.
(eglot--mapply, eglot--lambda): New helpers.
(eglot--uri-to-path): New helper.
(eglot--managed-mode): Manage xref-backend-functions.
(eglot-xref-backend): New function.
(xref-backend-identifier-completion-table)
(xref-backend-identifier-at-point)
(xref-backend-definitions): New methods.
(xref-backend-references)
(xref-backend-apropos): New methods, still unimplemented.
João Távora [Sat, 5 May 2018 01:16:10 +0000 (02:16 +0100)]
New helper eglot--sync-request
This should help with xref definitions
* eglot.el (eglot--request): Rework a bit. Continuation is always
cleared on timeout, regardless of user-supplied fn.
(eglot--sync-request): New function.
(eglot--process-receive): watch out for vector results.
João Távora [Sat, 5 May 2018 01:24:37 +0000 (02:24 +0100)]
Cleanup mistake with textdocumentitem and textdocumentidentifier
Also introduce eglot--path-to-uri
* eglot.el (eglot--path-to-uri): Rename from eglot--uri and rework.
(eglot--connect): Use it.
(eglot--current-buffer-TextDocumentIdentifier): New function.
(eglot--current-buffer-VersionedTextDocumentIdentifier)
(eglot--signal-textDocument/didChange)
(eglot--signal-textDocument/didClose)
(eglot--signal-textDocument/willSave)
(eglot--signal-textDocument/didSave): Use it.
João Távora [Fri, 4 May 2018 14:19:19 +0000 (15:19 +0100)]
Handle dynamic registration in general (but nothing specific yet)
* eglot.el (eglot--server-client/registerCapability): Implement.
(eglot--register-workspace/didChangeWatchedFiles): Dummy registrator.
João Távora [Fri, 4 May 2018 14:02:03 +0000 (15:02 +0100)]
Honour textdocumentsync
* eglot.el (eglot--signal-textDocument/didChange): Honour textDocumentSync
João Távora [Fri, 4 May 2018 13:42:02 +0000 (14:42 +0100)]
Be quite explicit about our lack of capabilities right now
* eglot.el (eglot--client-capabilities): Spread out.
João Távora [Fri, 4 May 2018 13:29:40 +0000 (14:29 +0100)]
Use rooturi instead of rootpath
* eglot.el (eglot--connect)
(eglot--current-buffer-VersionedTextDocumentIdentifier): Use
eglot--uri.
(eglot--uri): New function.
João Távora [Fri, 4 May 2018 13:18:12 +0000 (14:18 +0100)]
Make reported capabilities into its own function
* eglot.el (eglot--client-capabilities): New function.
(eglot--connect): Use it.
João Távora [Fri, 4 May 2018 13:15:41 +0000 (14:15 +0100)]
Include source info in diagnostics
* eglot.el (eglot--server-textDocument/publishDiagnostics):
Include source info.
João Távora [Fri, 4 May 2018 12:36:33 +0000 (13:36 +0100)]
Reply to client/registercapability (don't handle it yet)
* eglot.el (eglot--server-client/registerCapability): New
function.
João Távora [Fri, 4 May 2018 11:17:26 +0000 (12:17 +0100)]
Handle requests from server correctly
* eglot.el (eglot--process-receive): Redesign.
(eglot--process-send): Take REPLY arg. Discover if message is error.
(eglot--reply): new function
(eglot--log-event): Tweak docstring.
(eglot--process-receive): Reply with -32601 if unimplemented.
(eglot--server-window/showMessageRequest)
(eglot--server-client/registerCapability): Use eglot--reply
João Távora [Fri, 4 May 2018 11:03:51 +0000 (12:03 +0100)]
Don't auto-reconnect if last attempt lasted less than 3 seconds
* eglot.el (eglot--inhibit-auto-reconnect): New var.
(eglot--process-sentinel): Use it.
João Távora [Fri, 4 May 2018 10:54:06 +0000 (11:54 +0100)]
Workaround rls's regusal to treat nil as empty json object
* eglot.el (eglot--connect): Use dummy params.
João Távora [Fri, 4 May 2018 09:49:34 +0000 (10:49 +0100)]
Eglot-editing-mode becomes eglot--managed-mode
* eglot.el (eglot--sentinel): Use eglot--managed-mode.
(eglot--managed-mode-map): Renamed from eglot-editing-mode-map.
(eglot--managed-mode): Renamed from eglot-editing-mode.
(eglot-mode): Simplify.
(eglot--buffer-managed-p): New function.
(eglot--maybe-activate-editing-mode): Simplify.
João Távora [Fri, 4 May 2018 09:47:17 +0000 (10:47 +0100)]
Make m-x eglot's interactive spec a separate function
* eglot.el (eglot--interactive): New function.
(eglot): Rework a little.
João Távora [Fri, 4 May 2018 00:25:13 +0000 (01:25 +0100)]
When user declines to reconnect, first quit existing server
* eglot.el (eglot): Rework reconnection logic.
João Távora [Fri, 4 May 2018 10:21:11 +0000 (11:21 +0100)]
Connect to lsp server via tcp
* eglot.el (eglot--make-process): Rename from
eglot-make-local-process.
(eglot): Fix docstring and rework.
(eglot--bootstrap-fn): Remove
(eglot--contact): New process-local var.
(eglot--connect): Take CONTACT arg.
(eglot--reconnect): Rework.
João Távora [Fri, 4 May 2018 00:20:13 +0000 (01:20 +0100)]
More correctly keep track of didopen/didclose per buffer
* eglot.el (eglot--buffer-open-count): Now a process-local var.
(eglot--signal-textDocument/didOpen, eglot--signal-textDocument/didClose):
Use it.
João Távora [Thu, 3 May 2018 23:25:03 +0000 (00:25 +0100)]
Fix mode-line mouse-clicks from outside selected window
* eglot.el (eglot--mode-line-call): New helper.
(eglot--mode-line-format): Use it.
João Távora [Thu, 3 May 2018 23:12:53 +0000 (00:12 +0100)]
* eglot.el (eglot--process-receive): skip null method notifs.
João Távora [Thu, 3 May 2018 22:59:56 +0000 (23:59 +0100)]
Trim some edges and add a bunch of boring rpc methods
* eglot.el (eglot--connect): Don't call eglot--protocol-initialize.
(eglot--process-filter): Break long line.
(eglot--process-receive): Also pass id to handler if a server request.
(eglot--log): New helper.
(eglot-editing-mode): Manage before-revert-hook,
after-revert-hook, before-save-hook, after-save-hook.
(eglot--protocol-initialize): Removed.
(eglot--server-window/showMessage): Simplify.
(eglot--server-window/showMessageRequest)
(eglot--server-window/logMessage, eglot--server-telemetry/event):
New handlers.
(eglot--signal-textDocument/willSave)
(eglot--signal-textDocument/didSave): New notifications.
(eglot--signal-textDocument/didOpen)
(eglot--signal-textDocument/didClose): Check
eglot--buffer-open-count.
(eglot--buffer-open-count): New var.
João Távora [Thu, 3 May 2018 21:44:13 +0000 (22:44 +0100)]
Fix a couple of rust-related edge cases
* eglot.el (eglot--server-window/progress): Allow other keys.
(eglot--server-textDocument/publishDiagnostics): Allow :group in diagnostic
spec.
João Távora [Thu, 3 May 2018 21:42:13 +0000 (22:42 +0100)]
Fix textdocument/didchange
* eglot.el (eglot-editing-mode): Manage before-change-functions.
(eglot--recent-changes): Deleted.
(eglot--recent-before-changes): New var.
(eglot--recent-after-changes): Renamed from eglot--recent-changes.
(eglot--pos-to-lsp-position, eglot--before-change): New helpers.
(eglot--after-change): Rework.
(eglot--signal-textDocument/didChange): Rework.
João Távora [Thu, 3 May 2018 15:14:35 +0000 (16:14 +0100)]
Rename rpc methods for clarity
* eglot.el (eglot--process-receive): Search for RPC server methods
under `eglot--server-'
(eglot-editing-mode, eglot--maybe-activate-editing-mode): Use new
signal names.
(eglot--server-window/showMessage): Rename from
eglot--window/showMessage.
(eglot--server-textDocument/publishDiagnostics): Renamed from
eglot--textDocument/publishDiagnostics.
(eglot--current-buffer-versioned-identifier): Remove.
(eglot--current-buffer-VersionedTextDocumentIdentifier): Use
eglot--versioned-identifier.
(eglot--signal-textDocument/didChange): Renamed from
eglot--maybe-signal-didChange.
(eglot--signal-textDocument/didOpen): Renamed from
eglot--signalDidOpen.
(eglot--signal-textDocument/didClose): Rename from
eglot--signalDidClose.
(eglot-flymake-backend): Call eglot--signal-textDocument/didChange.
(eglot--server-window/progress): Rename from
eglot--window/progress.
João Távora [Thu, 3 May 2018 15:04:03 +0000 (16:04 +0100)]
Reorganize file
* eglot.el (eglot-mode-line): Move up.
(eglot-make-local-process, eglot--all-major-modes, eglot--obj)
(eglot--project-short-name, eglot--all-major-modes)
(eglot-reconnect, eglot--maybe-activate-editing-mode)
(eglot--protocol-initialize)
(eglot--window/showMessage, eglot--current-flymake-report-fn)
(eglot--unreported-diagnostics)
(eglot--textDocument/publishDiagnostics, eglot--signalDidOpen)
(eglot--signalDidClose): Move around.
(eglot-quit-server): Renamed to eglot-shutdown.
(eglot-shutdown): New function
João Távora [Thu, 3 May 2018 14:47:39 +0000 (15:47 +0100)]
Delete two useless forward declarations
* eglot.el (eglot-mode, eglot-editing-mode-map): Remove forward decls.